如同在前面 Playwright 章節提到的,在手動測試中,我們是透過眼睛看,透過手指點擊手機以及螢幕上的虛擬鍵盤輸入文字等步驟來執行我們的測試,但是在自動化測試中,我們需要透過腳本來達成以上的行為,因此本章節將會介紹在腳本中我們如何”看”到元件,因為元素定位是成功進行測試的關鍵,無論是點擊按鈕、輸入文字,還是驗證元素的存在,測試腳本都必須能夠準確的找到網頁上的特定元素。
在 Web 自動化測試中,我們可以透過瀏覽器提供的開發者模式來進行元件的定位,但是在 App 這邊,我們就需要透過其他工具來輔助我們取得這些資訊,如果還沒有閱讀過上一個章節關於 Appium Inspector 的話,可以先看看我們是如何透過 Appium Inspector 抓取到元件的。
以下是一些 App 自動化測試中常用的元件定位方法, 需要注意的是,在 Android 與 iOS 中,元件的邏輯是有些許差異的,因此在執行雙平台的測試時,需要特別注意兩邊的差異:
在 Android 的自動化測試中,ID 是最常見且最可靠的定位方式之一。在測試腳本中使用 ID 來定位元件是非常準確且高效的。例如:
Click Element "com.example.app:id/button_submit"
優點:唯一性強,定位速度快。
缺點:ID 必須是唯一的,如果開發人員更改了 ID,測試腳本需要同步更新。
Accessibility ID 通常用於提高應用程式的可訪問性,尤其對於有視力障礙的用戶。這也是一個常用的定位方法,尤其是在跨平台測試中,當介面相同時,元件的 Accessibility ID 通常都會一樣,因此 Accessibility ID 作為誇平台的自動化測試是個不錯的選擇,通常在 iOS 的測試中,我們對於元件 id 的定位都會透過這個方式,不過這相當仰賴開發時就需要請 RD 一並將 Accessibility ID 加入 code 中,方便我們做調用。
Click Element accessibility_id="SubmitButton"
優點:可讀性高,通常不易改變,對於多平台應用程式特別有用。
缺點:如果開發人員未設置 Accessibility ID,則無法使用此方式。
XPath 是一種路徑語言,可以用來導航 XML 結構中的任意節點。當 ID 不可用時,XPath 是一個強大的定位工具。XPath 可以根據元件的層級結構進行定位,例如:
Click Element //XCUIElementTypeStaticText[@name='送出']
優點:靈活,可以根據元件的屬性或結構來定位。
缺點:運行速度較慢,且易受到 UI 結構變化的影響,使得維護成本較高。
根據元件的類別名稱來定位。這適用於元件類別名稱比較獨特且不會重複的情況。
Click Element class="android.widget.Button"
優點:方便識別特定類別的元件。
缺點:如果有多個相同類別的元件,定位結果可能會不精確。
座標定位是一種較為特殊的方式,通常用於無法使用其他標準方法定位的情況下。它透過點擊螢幕上的特定位置來進行操作。
@{coordinates} = Create List ${x} ${y}
Tap With Positions ${100} ${coordinates}
優點:當元件沒有明確標識時,座標是最後的選擇,因為座標會因為畫面的變動,或是測試裝置不同而導致測試失敗,如果逼不得以需要使用的話,可以透過取得螢幕的分辨率後透過計算點擊位置的百分比能夠有效提升在不同型號裝置上的測試問題。
缺點:座標不穩定,螢幕分辨率或 UI 佈局的改變都可能導致測試失效。
除了上面介紹的幾種外,Robot Framework AppiumLibrary 提供了下圖的定位方式,有非常多種選擇,因此在開發時,我們可以根據當前 app 的狀況,選擇最適合的定位方式
在選擇定位方式時,可以根據以下幾個準則進行選擇:
在一個實際專案中,可能需要結合多種定位方式來保證測試的穩定性和靈活性。例如,優先使用 ID 或 Accessibility ID,當這些不可用時再選擇 XPath 或其他方法。
我們也可以透過 Appium Inspector 查看哪種方式取得元件的速度是最快的,透過點擊下圖數字 1 的位置,這時候便會出現數字 2 的區塊,我們便可以得知哪一種定位方式的速度是最快的,往往會因為畫面定位速度有所不同,不過這個僅供參考,實際上的使用還是需要根據專案的特性而定。
在 App 自動化測試中,定位元件是至關重要的步驟。透過正確選擇定位方法,可以大大提升測試腳本的穩定性和可維護性。ID 和 Accessibility ID 是最推薦的定位方式,而 XPath 則在特定情況下具有很大的靈活性。在實際應用中,應根據應用程式的特性選擇最合適的定位方法,以確保測試的可靠性與有效性。